package com.yoyiyi.soleil.utils.sdcard;

import android.annotation.TargetApi;
import android.os.Build;
import android.os.Environment;
import android.os.StatFs;

import com.yoyiyi.soleil.utils.CloseUtils;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;

/**
 * @author zzq  作者 E-mail:   soleilyoyiyi@gmail.com
 * @date 创建时间：2017/6/30 23:07
 * 描述:
 */
    public final class SDCardUtils {

        private SDCardUtils() {
            throw new UnsupportedOperationException("u can't instantiate me...");
        }

        /**
         * 判断SD卡是否可用
         *
         * @return true : 可用<br>false : 不可用
         */
        public static boolean isSDCardEnable() {
            return Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState());
        }

        /**
         * 获取SD卡路径
         * <p>先用shell，shell失败再普通方法获取，一般是/storage/emulated/0/</p>
         *
         * @return SD卡路径
         */
        public static String getSDCardPath() {
            if (!isSDCardEnable()) return null;
            String cmd = "cat /proc/mounts";
            Runtime run = Runtime.getRuntime();
            BufferedReader bufferedReader = null;
            try {
                Process p = run.exec(cmd);
                bufferedReader = new BufferedReader(new InputStreamReader(new BufferedInputStream(p.getInputStream())));
                String lineStr;
                while ((lineStr = bufferedReader.readLine()) != null) {
                    if (lineStr.contains("sdcard") && lineStr.contains(".android_secure")) {
                        String[] strArray = lineStr.split(" ");
                        if (strArray.length >= 5) {
                            return strArray[1].replace("/.android_secure", "") + File.separator;
                        }
                    }
                    if (p.waitFor() != 0 && p.exitValue() == 1) {
                        break;
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                CloseUtils.closeIO(bufferedReader);
            }
            return Environment.getExternalStorageDirectory().getPath() + File.separator;
        }

        /**
         * 获取SD卡data路径
         *
         * @return SD卡data路径
         */
        public static String getDataPath() {
            if (!isSDCardEnable()) return null;
            return Environment.getExternalStorageDirectory().getPath() + File.separator + "data" + File.separator;
        }

        /**
         * 获取SD卡剩余空间
         *
         * @return SD卡剩余空间
         */
        @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
        public static String getFreeSpace() {
            if (!isSDCardEnable()) return null;
            StatFs stat = new StatFs(getSDCardPath());
            long blockSize, availableBlocks;
            availableBlocks = stat.getAvailableBlocksLong();
            blockSize = stat.getBlockSizeLong();
            return ConvertUtils.byte2FitMemorySize(availableBlocks * blockSize);
        }
    /**
     * 获取SD卡剩余空间
     *
     * @return SD卡剩余空间
     */
    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    public static String getAllSpace() {
        if (!isSDCardEnable()) return null;
        StatFs stat = new StatFs(getSDCardPath());
        long blockCountLong = stat.getBlockCountLong();
        long blockSizeLong = stat.getBlockSizeLong();
        return ConvertUtils.byte2FitMemorySize(blockCountLong * blockSizeLong);
    }

        /**
         * 获取SD卡信息
         *
         * @return SDCardInfo
         */
        @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
        public static String getSDCardInfo() {
            if (!isSDCardEnable()) return null;
            SDCardInfo sd = new SDCardInfo();
            sd.isExist = true;
            StatFs sf = new StatFs(Environment.getExternalStorageDirectory().getPath());
            sd.totalBlocks = sf.getBlockCountLong();
            sd.blockByteSize = sf.getBlockSizeLong();
            sd.availableBlocks = sf.getAvailableBlocksLong();
            sd.availableBytes = sf.getAvailableBytes();
            sd.freeBlocks = sf.getFreeBlocksLong();
            sd.freeBytes = sf.getFreeBytes();
            sd.totalBytes = sf.getTotalBytes();
            return sd.toString();
        }

        public static class SDCardInfo {
            boolean isExist;
            long    totalBlocks;
            long    freeBlocks;
            long    availableBlocks;
            long    blockByteSize;
            long    totalBytes;
            long    freeBytes;
            long    availableBytes;

            @Override
            public String toString() {
                return "isExist=" + isExist +
                        "\ntotalBlocks=" + totalBlocks +
                        "\nfreeBlocks=" + freeBlocks +
                        "\navailableBlocks=" + availableBlocks +
                        "\nblockByteSize=" + blockByteSize +
                        "\ntotalBytes=" + totalBytes +
                        "\nfreeBytes=" + freeBytes +
                        "\navailableBytes=" + availableBytes;
            }
        }
}
